const parser = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const generate = require("@babel/generator").default;
const types = require("@babel/types");
const _ = require("lodash");
const babelParsers = require("prettier/parser-babel").parsers;
const typescriptParsers = require("prettier/parser-typescript").parsers;


function myPreprocessor(code, options) {
    // 第一步，调用 parser.parse 把代码转成 AST
    const ast = parser.parse(code, {
        plugins: ["typescript", "jsx"], // 如果 parse ts 和 jsx 代码，需要分别指定 typescript 和 jsx 插件。
        sourceType: "module", // sourceType 为 module 代表是有 import 或者 export 的模块代码
    });
    // 第二步，把imports 节点找出来。
    const importNodes = [];

    traverse(ast, {
        ImportDeclaration(path) {
            importNodes.push(_.clone(path.node));

            path.remove();
        }
    });

    const newImports = _.shuffle(importNodes);

    const newAST = types.file({
        type: "Program",
        body: newImports,
    });

    const newCode = generate(newAST).code +
        "\n" +
        generate(ast, {
            retainLines: true,
        }).code;

    return newCode;

}


module.exports = {
    parsers: {
        babel: {
            ...babelParsers.babel,
            preprocess: myPreprocessor,
        },
        typescript: {
            ...typescriptParsers.typescript,
            preprocess: myPreprocessor,
        },
    },
};
